package com.tedu.api.d4_io.copyfile;

import java.io.*;
import java.util.Scanner;

/*
  本类用于IO综合练习：文件复制
  需求：接受用户输入的文件路径来复制，
       复制到用户指定的路径下
 */
public class Test_CopyFile {
    public static void main(String[] args) {
        System.out.println("请输出文件路径： ");
        String f=new Scanner(System.in).nextLine();
        System.out.println("请输入目标文件路径： ");
        String t=new Scanner(System.in).nextLine();

        //根据文件路径，封装File对象
        File from = new File(f);
        File to=new File(t);

        //ZFCopy(from,to);
        ZJCopy(from,to);

    }
    /*
     根据文件路径完成操作---字节流
     */
    public static void ZJCopy(File from, File to) {
        InputStream in=null;
        OutputStream out=null;

        try {
            in=new BufferedInputStream(new FileInputStream(from));
            out=new BufferedOutputStream(new FileOutputStream(to));

            /**
             * 需求：批量读取，使用read(byte[] b)
             * 长度？8192 建议与源码保持一直
             * 8*1024=8192=8k
             * */
            int b;
            byte[] bs=new byte[8192];
            while ((b=in.read(bs))!=-1){
                out.write(bs);
            }
            System.out.println("复制成功！");

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
     根据文件路径完成操作---字符流
     */
    public static void ZFCopy(File from,File to) {
        Reader in=null;//字符输入流---抽象父类
        Writer out=null;//字符输出流---抽象父类

        try {
            //读取源文件from
            in=new BufferedReader(new FileReader(from));

            //写出到目标文件
            out=new BufferedWriter(new FileWriter(to,true));

            //开始复制操作 定义变量保存数据
            int b;
            while ((b=in.read())!=-1){
                out.write(b);//把读到的信息写到文件中
            }
            System.out.println("复制成功！");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
                /*
                 释放资源
                 1.流资源必须释放，释放的是之前使用过程中所有流对象
                 2.顺序：后面出现的流先释放！
                 */
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
